學習資料科學主要有幾個套件非常重要,重要和常用的套件如下:
但我的30天裡面只有針對以下四個套件Numpy、Pandas、Matplotlib、Seaborn有比較詳細的介紹,而今天要先來介紹Numpy。
打開Anaconda Prompt看是否有安裝Numpy(使用「conda list」指令),沒有就執行
pip install numpy
numpy有很多內建函式可以建立ndarray,現在將相同性質的函式放在一起介紹
import numpy as np
ironman_zeros = np.zeros(10, dtype=int) #建立一個內容為0 長度為10的整數陣列
ironman_ones = np.ones((3,5) ,dtype=float) #建立一個內容為1 3x5 的浮點數陣列
ironman_empty = np.empty((3,2) ) #建立一個內容為1 3x2 的無初始值陣列
ironman_full = np.full((4,2), 2.2) #建立一個內容為2.2 4x2 的浮點數陣列
print('ironman_zeros---->', ironman_zeros)
print('ironman_ones---->', ironman_ones)
print('ironman_empty---->', ironman_empty)
print('ironman_full---->', ironman_full)
# 輸出結果
ironman_zeros----> [0 0 0 0 0 0 0 0 0 0]
ironman_ones----> [[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
ironman_empty----> [[1.37961302e-306 1.00136557e-307]
[1.60218763e-306 1.69121367e-306]
[6.23040373e-307 1.60219035e-306]]
ironman_full----> [[2.2 2.2]
[2.2 2.2]
[2.2 2.2]
[2.2 2.2]]
ironman_arange = np.arange(0,20,2) #建立一個依序填滿的陣列 0到20間隔為2
ironman_linspace = np.linspace(0,1,5) #建立一個5個值的陣列,在0到1間平均分布
print('ironman_arange---->', ironman_arange)
print('ironman_linspace---->', ironman_linspace)
# 輸出結果
ironman_arange----> [ 0 2 4 6 8 10 12 14 16 18]
ironman_linspace----> [0. 0.25 0.5 0.75 1. ]
ironman_random = np.random.random((3,3)) #建立一個3*3 陣列,在0到1間亂數值
ironman_ranf = np.random.ranf((5)) #建立一個5 陣列,在0到1間亂數值
ironman_sample = np.random.sample((2,3)) #建立一個2*3 陣列,在0到1間亂數值
print('ironman_random---->', ironman_random)
print('ironman_ranf---->', ironman_ranf)
print('ironman_sample---->', ironman_sample)
# 輸出結果
ironman_random----> [[0.64353867 0.04610781 0.78987197]
[0.75626182 0.29991636 0.92585699]
[0.63849181 0.16742412 0.2124621 ]]
ironman_ranf----> [0.94065174 0.76792842 0.58185392 0.51702131 0.13499956]
ironman_sample----> [[0.2181921 0.88624691 0.40748053]
[0.72171909 0.2094024 0.58329048]]
ironman_normal = np.random.normal(0,1,(3,3)) #建立一個3*3陣列,內容為常態分佈的亂數值 平均0,標準差1
print('ironman_normal---->', ironman_normal)
# 輸出結果
ironman_normal----> [[ 0.29675527 0.5483744 -0.68793494]
[-0.82978447 -0.14248656 -0.01019463]
[-0.89532166 -0.0651036 -0.27911572]]
ironman_randint = np.random.randint(0,10,(3,3)) #建立一個3*3陣列,內容介於0到10的整數
print('ironman_randint---->', ironman_randint)
# 輸出結果
ironman_randint----> [[3 0 7]
[0 0 7]
[1 7 8]]
剛剛示範了如何建立陣列,現在來看關於陣列,有什麼基本屬性可以使用。
先建立三個陣列各別是一維陣列、二維陣列、三維陣列,再用此三個陣列來顯示屬性。
ironman_x1 = np.random.randint(10, size=6) #一維陣列
ironman_x2 = np.random.randint(10, size=(3,4)) #二維陣列
ironman_x3 = np.random.randint(10, size=(2,3,2)) #三維陣列
print("ironman_x1---->", ironman_x1)
print("ironman_x2---->", ironman_x2)
print("ironman_x3---->", ironman_x3)
# 輸出結果
ironman_x1----> [2 3 9 7 5 3]
ironman_x2----> [[4 5 3 3]
[7 9 9 9]
[7 3 2 3]]
ironman_x3----> [[[9 7]
[7 5]
[1 2]]
[[2 8]
[1 5]
[8 4]]]
print("ironman_x1 ndim: ", ironman_x1.ndim)
print("ironman_x2 ndim: ", ironman_x2.ndim)
print("ironman_x3 ndim: ", ironman_x3.ndim)
# 輸出結果
ironman_x1 ndim: 1
ironman_x2 ndim: 2
ironman_x3 ndim: 3
print("ironman_x1 shape: ", ironman_x1.shape)
print("ironman_x2 shape: ", ironman_x2.shape)
print("ironman_x3 shape: ", ironman_x3.shape)
# 輸出結果
ironman_x1 shape: (6,)
ironman_x2 shape: (3, 4)
ironman_x3 shape: (2, 3, 2)
print("ironman_x1 size: ", ironman_x1.size) # 6 x 1
print("ironman_x2 size: ", ironman_x2.size) # 3 x 4
print("ironman_x3 size: ", ironman_x3.size) # 2 x 3 x 4
# 輸出結果
ironman_x1 size: 6
ironman_x2 size: 12
ironman_x3 size: 12
print("ironman_x1 dtype: ", ironman_x1.dtype)
print("ironman_x2 dtype: ", ironman_x2.dtype)
print("ironman_x3 dtype: ", ironman_x3.dtype)
# 輸出結果
ironman_x1 dtype: int32
ironman_x2 dtype: int32
ironman_x3 dtype: int32
print("ironman_x1 itemsize: ", ironman_x1.itemsize)
print("ironman_x2 itemsize: ", ironman_x2.itemsize)
print("ironman_x3 itemsize: ", ironman_x3.itemsize)
# 輸出結果
ironman_x1 itemsize: 4
ironman_x2 itemsize: 4
ironman_x3 itemsize: 4
print("ironman_x1 nbytes: ", ironman_x1.nbytes)
print("ironman_x2 nbytes: ", ironman_x2.nbytes)
print("ironman_x3 nbytes: ", ironman_x3.nbytes)
# 輸出結果
ironman_x1 nbytes: 24
ironman_x2 nbytes: 48
ironman_x3 nbytes: 48
使用陣列的索引來取值和修改值
# 取得陣列值
print("ironman_x1[2]----->", ironman_x1[2])
print("ironman_x2[2,2]----->", ironman_x2[2,2])
print("ironman_x3[1,1,1]----->", ironman_x3[1,1,1])
# 修改陣列值
ironman_x1[2] = 7
ironman_x2[2,2] = 4
ironman_x3[1,1,1] = 3
print("ironman_x1[2]----->", ironman_x1[2])
print("ironman_x2[2,2]----->", ironman_x2[2,2])
print("ironman_x3[1,1,1]----->", ironman_x3[1,1,1])
# 輸出結果
ironman_x1[2]-----> 9
ironman_x2[2,2]-----> 2
ironman_x3[1,1,1]-----> 5
ironman_x1[2]-----> 7
ironman_x2[2,2]-----> 4
ironman_x3[1,1,1]-----> 3
可以使用切片的方式來取得元素和修改元素
ironman_x4 = np.arange(10)
print('ironman_x4---->', ironman_x4)
print('ironman_x4[:5]----->',ironman_x4[:5]) # 前面5個元素
print('ironman_x4[5:]----->',ironman_x4[5:]) # index5 之後的元素
print('ironman_x4[4:7]----->',ironman_x4[4:7]) # index 4~(7-1) 的元素
print('ironman_x4[::2]----->',ironman_x4[::2]) # 間隔2的所有元素
print('ironman_x4[1::2]----->',ironman_x4[1::2]) # index1開始 間隔2的所有元素
print('ironman_x4[::-1]----->',ironman_x4[::-1]) # 反轉元素
# 輸出結果
ironman_x4----> [0 1 2 3 4 5 6 7 8 9]
ironman_x4[:5]-----> [0 1 2 3 4]
ironman_x4[5:]-----> [5 6 7 8 9]
ironman_x4[4:7]-----> [4 5 6]
ironman_x4[::2]-----> [0 2 4 6 8]
ironman_x4[1::2]-----> [1 3 5 7 9]
ironman_x4[::-1]-----> [9 8 7 6 5 4 3 2 1 0]
ironman_x5 = np.random.randint(10, size=(3,4)) #二維陣列
print('ironman_x5---->', ironman_x5)
print('ironman_x5[:2, :3]----->',ironman_x5[:2, :3]) # 取得 2列 3欄
print('ironman_x5[:3, ::2]----->',ironman_x5[:3, ::2]) # 取得 3列 偶數欄
print('ironman_x5[:,0]----->',ironman_x5[:,0]) #取得 所有列 第(0+1)欄
print('ironman_x5[2,:]----->',ironman_x5[2,:]) #取得 第(2+1)列 所有欄
# 輸出結果
ironman_x5----> [[4 4 0 9]
[3 7 3 2]
[1 1 2 1]]
ironman_x5[:2, :3]-----> [[4 4 0]
[3 7 3]]
ironman_x5[:3, ::2]-----> [[4 0]
[3 3]
[1 2]]
ironman_x5[:,0]-----> [4 3 1]
ironman_x5[2,:]-----> [1 1 2 1]
異動子陣列,原來的陣列會被異動,使用.copy()就可以複製一份資料
示範建立一個一維陣列變成3*1
x = np.array([1,2,3])
print('x----->', x)
x_reshape = x.reshape((3,1)) # 透過reshape建立欄向量
print('x_reshape----->', x_reshape)
# 輸出結果
x-----> [1 2 3]
x_reshape-----> [[1]
[2]
[3]]
y = np.array([4,5,6])
print('concatenate----->',np.concatenate([x,y])) # 串接陣列
print('vstack----->',np.vstack([x,y])) # 垂直串接
print('hstack----->',np.hstack([x,y])) # 水平串接
# 輸出結果
concatenate-----> [1 2 3 4 5 6]
vstack-----> [[1 2 3]
[4 5 6]]
hstack-----> [1 2 3 4 5 6]
z = np.array([1,2,3,4,5,6,7,8,9])
z1,z2,z3 = np.split(z,[3,5]) # 分割3個陣列 [index 0~(3-1) ] [ index 3~(5-1)] [index (5~end)]
print("z1---->", z1)
print("z2---->", z2)
print("z3---->", z3)
z = np.array([[1,2,3],[4,5,6],[7,8,9]])
print('vsplit----->',np.vsplit(z,[2])) # 垂直分割
print('hsplit----->',np.hsplit(z,[2])) # 水平分割
# 輸出結果
z1----> [1 2 3]
z2----> [4 5]
z3----> [6 7 8 9]
vsplit-----> [array([[1, 2, 3],
[4, 5, 6]]), array([[7, 8, 9]])]
hsplit-----> [array([[1, 2],
[4, 5],
[7, 8]]), array([[3],
[6],
[9]])]
忍不住加上心得分享,最近已經寫完30天,所以打算來將之前的文章做排版,忽然間覺得Numpy看完第一天其實就可以了,= =a,我自己整理的時候看到今天這樣長,都有一種快放棄的感覺,現在看了一下後面的金融分析,恩,我覺得如果想要更進一步的才看Day8、Day9。不然其實看完Day7就綽綽有餘了.....。
筆誤:
ironman_sample = np.random.sample((2,3)) #建立一個323 陣列,在0到1間亂數值
2*3 陣列
print('ironman_x5[:3, ::2]----->',ironman_x5[:3, ::2]) # 取得 3列 偶數欄
1::2 ?
大大,感謝你的細心觀看
ironman_sample = np.random.sample((2,3)) #建立一個2*3 陣列,在0到1間亂數值
已經修正
print('ironman_x5[:3, ::2]----->',ironman_x5[:3, ::2]) # 取得 3列 偶數欄
關於這部分請問有什麼問題嗎@@?
偶數欄應該從1開始算?
print('ironman_x5[:3, 1::2]----->',ironman_x5[:3, 1::2])
喔,原來是從0開始,0也是偶數沒錯!